﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.Enums;

namespace ComunesMGI.DataTypes
{
    [Serializable]
    public class DataCampo
    {
        private CampoSharepoint _tipo;
        private string _titulo;
        private string _valor;
        private bool _requerido;
        private ParteMail _parteMail;
        private List<string> _opciones;

        public DataCampo(CampoSharepoint tipo, string titulo, string valor, bool requerido, List<string> opciones)
        {
            this._tipo = tipo;
            this._titulo = titulo;
            this._valor = valor;
            this._requerido = requerido;
            this._opciones = opciones;
        }

        public DataCampo(CampoSharepoint tipo, string titulo, ParteMail parteMail, string valor, bool requerido, List<string> opciones)
        {
            this._tipo = tipo;
            this._titulo = titulo;
            this._valor = valor;
            this._requerido = requerido;
            this._opciones = opciones;
            this._parteMail = parteMail;
        }

        public DataCampo(string titulo, ParteMail parteMail)
        {
            this._titulo = titulo;
            this._parteMail = parteMail;
        }


        public bool Requerido
        {
            get { return _requerido; }
            set { _requerido = value; }
        }


        public string Titulo
        {
            get { return _titulo; }
            set { _titulo = value; }
        }


        public CampoSharepoint Tipo
        {
            get { return _tipo; }
            set { _tipo = value; }
        }

        public string Valor
        {
            get { return _valor; }
            set { _valor = value; }
        }

        public List<string> Opciones
        {
            get { return _opciones; }
            set { _opciones = value; }
        }

        public ParteMail ParteMail
        {
            get { return _parteMail; }
            set { _parteMail = value; }
        }

        public override bool Equals(Object obj)
        {
            DataCampo campo = (DataCampo)obj;
            bool igualesColecciones = true;
            if (campo.Opciones != null && this.Opciones != null)
            {
                foreach (string opcion in this.Opciones)
                {
                    if (!campo.Opciones.Contains(opcion))
                    {
                        igualesColecciones = false;
                        break;
                    }
                }
                if (igualesColecciones)
                {
                    foreach (string opcion in campo.Opciones)
                    {
                        if (!this.Opciones.Contains(opcion))
                        {
                            igualesColecciones = false;
                            break;
                        }
                    }
                }
            }
            else
            {
                if (campo.Opciones == null && this.Opciones != null)
                {
                    igualesColecciones = false;
                }
                else if (campo.Opciones != null && this.Opciones != null)
                {
                    igualesColecciones = false;
                }
            }
            return ((this.Tipo == campo.Tipo) && (this.Titulo == campo.Titulo) && (this.Valor == campo.Valor)
                        && (this.Requerido == campo.Requerido) && (this.ParteMail == campo.ParteMail) && igualesColecciones);

        }

        public override int GetHashCode()
        {

            int hash = 0;
            if (this._opciones != null)
                hash ^= this._opciones.GetHashCode();
            
            hash ^= this._parteMail.GetHashCode();
            hash ^= this._requerido.GetHashCode();
            
            hash ^= this._tipo.GetHashCode();
            if (this._titulo != null)
                hash ^= this._valor.GetHashCode();
            return hash;
        }



    }

}
